#pragma once
/*
    http传输层使用到的TCP协议
    1.Tcp协议是可靠性传输协议，属于传输层
*/
#include"Socket.hpp"//封装好的套接字接口类
class TcpServer
{
    private:
    Sock listen_fd;//监听fd
    uint16_t port_;//绑定的端口

   static TcpServer* tcp_ptr;//用来实现单例//静态类方法只能调用静态类成员？
   static pthread_mutex_t lock_;//锁
   private:
    TcpServer(const uint16_t& port):port_(port){}
    TcpServer(const TcpServer&)=delete;//禁止拷贝构造
    TcpServer& operator=(const TcpServer&)=delete;//禁止赋值构造
    public:
    ~TcpServer(){}
    public:
    void InitServer()
    {
        //Tcp协议套接字的创建、绑定、监听
        listen_fd.Socket();
        listen_fd.Bind(port_);
        listen_fd.Listen();
    }

    //获取监听套接字接口
    Sock* GetListenFd()
    {
        return &listen_fd;
    }
    //获取单例接口
   static TcpServer* GetInsatnce(const uint16_t&port) //静态类方法
    {
        //避免多线程并发访问带来的数据不一致的问题在访问前先上锁
        if(nullptr==tcp_ptr)
        {
            pthread_mutex_lock(&lock_);
            if(nullptr==tcp_ptr)
            {
            tcp_ptr=new TcpServer(port);
            tcp_ptr->InitServer();
            }
            pthread_mutex_unlock(&lock_);
            

        }
        return tcp_ptr;
    }
};
TcpServer* TcpServer::tcp_ptr=nullptr;
pthread_mutex_t TcpServer::lock_=PTHREAD_MUTEX_INITIALIZER;//全局锁可不用初始化跟销毁